#ifndef __QUEUE_H__
#define __QUEUE_H__

#include <stdbool.h>

#define MAXSIZE 10
#define ElemType int

typedef struct
{
    ElemType *base;
    int front;
    int rear;
    // 使用数字用于标识队列中的位置
} CirQueue;

/**
 * @brief 初始化队列为空
 *
 * @param pq 插入队列指针
 * @return true
 * @return false
 */
void InitializeQueue(CirQueue *pq);

/**
 * @brief 确定队列为空
 *
 * @param pq 插入队列指针
 * @return true
 * @return false
 */
bool QueueIsEmpty(const CirQueue *pq);

/**
 * @brief 确定队列为满
 *
 * @param pq 插入队列指针
 * @return true
 * @return false
 */
bool QueueIsFull(const CirQueue *pq);

/**
 * @brief 得到队列的项数
 *
 * @param pq 插入队列指针
 * @return unsigned int 返回队列的项数
 */
unsigned int QueueItemCount(const CirQueue *pq);

/**
 * @brief Get the Top object
 *
 * @param elem
 * @param pq
 * @return true
 * @return false
 */
bool getTop(ElemType *elem, CirQueue *pq);

/**
 * @brief 添加队列尾部添加项
 *
 * @param item
 * @param pq 插入队列指针
 * @return true
 * @return false
 */
bool AddItemFromTail(ElemType item, CirQueue *pq);

// Item DeleteItemFromTail(Queue * pq);

/**
 * @brief 从队列开头删除项
 *
 * @param pitem item指针,通常新建一个空指针传入,队列中待删除的项存储在pitem中指向的位置
 * @param pq 插入队列指针
 * @return true
 * @return false
 */
bool DeleteItemFromTail(ElemType *pitem, CirQueue *pq);

/**
 * @brief 清空队列
 *
 * @param pq
 * @return true
 * @return false
 */
bool EmptyQueue(CirQueue *pq);

#endif __QUEUE_H__
